// 题目描述：给定一个只包括 '('，')'，'{'，'}'，'['，']' 的字符串，判断字符串是否有效。

// 有效字符串需满足： 左括号必须用相同类型的右括号闭合。
// 左括号必须以正确的顺序闭合。
// 注意空字符串可被认为是有效字符串。
// 用一个map来维护左括号和右括号的对应关系
const leftToRight = {
  '(': ')',
  '[': ']',
  '{': '}'
};
/**
 *
 * @param s
 */
const isValid = s => {
  // 空字符串无条件分会为true
  if (!s) return true;
  // 创建一个栈
  const stack = [];
  // 缓存字符长度
  const len = s.length;

  for (let index = 0; index < len; index++) {
    // 如果是左括号,就把映射的右括号推进栈里
    const ch = s[index];
    if (ch === '[' || ch === '{' || ch === '(') {
      // @ts-ignore
      stack.push(leftToRight[ch]);
      // 若不是左括号,就看是不是和左括号想匹配的右括号
    } else {
      // 若栈为空，或栈顶的左括号没有和当前字符匹配上，那么判为无效
      if (!stack.length || stack.pop() !== ch) {
        return false;
      }
    }
  }
  // 若所有的左右括号都能匹配,则说明时有效的,这个时候栈应该是空的
  return !stack.length;
};
